#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <functional>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

//    定义了 child_dialog_ 为 MainWindow 的私有成员变量
    child_dialog_ = new childDialog(this);

    // showDialog 函数的参数个数少于 clicked 函数的参数个数就可以了
//    connect(ui->button, SIGNAL(clicked(bool)), this, SLOT(showChildDialogSlot()));

    // 自己的信号 连接 自己的槽函数
//    connect(ui->button, &QPushButton::clicked, this, &MainWindow::showChildDialogSlot);

    // 自己的信号 连接 别人的槽函数
    connect(ui->button, &QPushButton::clicked, child_dialog_, &childDialog::showChildDialogSlot);
//    connect(ui->button, &QPushButton::clicked, child_dialog_, &child_dialog_->showChildDialogSlot); // error：showChildDialogSlot是非static成员函数的问题

    // 一些包装器的
//    connect(ui->button, &QPushButton::clicked, this, [=]{ child_dialog_->showChildDialogSlot(); });                    // lambda
//    std::function<void(void)> func = [=]{child_dialog_->showChildDialogSlot();};
//    connect(ui->button, &QPushButton::clicked, this, func);                                                            // std::function
//    connect(ui->button, &QPushButton::clicked, this, std::bind(&childDialog::showChildDialogSlot, child_dialog_, 10)); // std::bind



    // 别人的信号 连接 自己的槽函数
    connect(child_dialog_, &childDialog::showMainWindowSignal, this, &MainWindow::showMainWindowSlot);
}

MainWindow::~MainWindow()
{
    delete ui;

    if(child_dialog_ != nullptr){
        delete child_dialog_;
        child_dialog_ = nullptr;
    }
}

void MainWindow::showChildDialogSlot(){
//    QDialog* child_dialog_ = new QDialog(this);
//    child_dialog_->show();

    this->hide();
    child_dialog_->show();
}

void MainWindow::showMainWindowSlot(){
    this->show();
    child_dialog_->hide();
}
